// #include <iostream>
// #include <vector>
// #include <unistd.h>
// #include <pthread.h>

// int tickets = 10000;

// class threadData
// {
// public:
//     threadData(const std::string &threadname, pthread_mutex_t *mutex_p)
//         : _threadname(threadname), _mutex_p(mutex_p)
//     {
//     }
//     ~threadData() {}

// public:
//     std::string _threadname;
//     pthread_mutex_t *_mutex_p;
// };

// void *getTicket(void *args)
// {
//     // std::string threadname = static_cast<const char *>(args);
//     threadData *td = static_cast<threadData *>(args);
//     while (true)
//     {
//         pthread_mutex_lock(td->_mutex_p);
//         if (tickets > 0)
//         {
//             usleep(1000);
//             std::cout << td->_threadname << " 正在进行抢票: " << tickets << std::endl;
//             tickets--;
//             pthread_mutex_unlock(td->_mutex_p);
//         }
//         else
//         {
//             pthread_mutex_unlock(td->_mutex_p);
//             break;
//         }
//     }

//     return nullptr;
// }

// int main()
// {
// #define NUM 4
//     pthread_mutex_t lock;
//     pthread_mutex_init(&lock, nullptr);

//     std::vector<pthread_t> tids(NUM);
//     for (int i = 0; i < NUM; i++)
//     {
//         char buffer[64];
//         snprintf(buffer, sizeof buffer, "thread %d", i + 1);
//         threadData *td = new threadData(buffer, &lock);
//         pthread_create(&tids[i], nullptr, getTicket, td);
//     }

//     for (int i = 0; i < NUM; i++)
//     {
//         pthread_join(tids[i], nullptr);
//     }

//     // pthread_t t1, t2, t3, t4;
//     // pthread_create(&t1, nullptr, getTicket, (void *)"thread 1");
//     // pthread_create(&t2, nullptr, getTicket, (void *)"thread 2");
//     // pthread_create(&t3, nullptr, getTicket, (void *)"thread 3");
//     // pthread_create(&t4, nullptr, getTicket, (void *)"thread 4");

//     // pthread_join(t1, nullptr);
//     // pthread_join(t2, nullptr);
//     // pthread_join(t3, nullptr);
//     // pthread_join(t4, nullptr);
//     return 0;
// }

#include <iostream>
#include <string>
#include <unistd.h>
#include <pthread.h>

int tickets = 1000;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void *start_routine(void *args)
{
    std::string name = static_cast<const char *>(args);
    while (true)
    {
        pthread_mutex_lock(&mutex);
        pthread_cond_wait(&cond, &mutex); // 为什么要有mutex，后面就说
        // 判断暂时省略
        std::cout << name << " -> " << tickets << std::endl;
        tickets--;
        pthread_mutex_unlock(&mutex);
    }
}

int main()
{
    // 通过条件变量控制线程的执行
    pthread_t t[5];
    for (int i = 0; i < 5; i++)
    {
        char *name = new char[64];
        snprintf(name, 64, "thread %d", i + 1);
        pthread_create(t+i, nullptr, start_routine, name);
    }

    while (true)
    {
        sleep(1);
        // pthread_cond_signal(&cond);
        pthread_cond_broadcast(&cond);
        std::cout << "main thread wakeup one thread..." << std::endl;
    }
    for (int i = 0; i < 5; i++)
    {
        pthread_join(t[i], nullptr);
    }

    return 0;
}